from __future__ import absolute_import
from .celery import app
from datetime import datetime, timedelta
import time
import random
import string
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

@app.task
def print_current_time():
    """每分钟打印当前时间的任务"""
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"当前时间是: {current_time}")
    return f"打印时间: {current_time}"

@app.task
def remind_medicine():
    """在当前时间顺延2分钟提示吃药的任务"""
    current_time = datetime.now()
    reminder_time = current_time + timedelta(minutes=2)
    reminder_time_str = reminder_time.strftime('%Y-%m-%d %H:%M:%S')
    print(f"提醒: 请在 {reminder_time_str} 记得吃药!")
    return f"吃药提醒设置在: {reminder_time_str}"

# 可以添加一个手动触发的任务，用于测试
@app.task
def manual_remind(minutes=2):
    """手动设置在指定分钟后提醒吃药"""
    current_time = datetime.now()
    reminder_time = current_time + timedelta(minutes=minutes)
    reminder_time_str = reminder_time.strftime('%Y-%m-%d %H:%M:%S')
    print(f"提醒: 请在 {reminder_time_str} 记得吃药!")

    # 实际等待到指定时间
    wait_seconds = (reminder_time - datetime.now()).total_seconds()
    if wait_seconds > 0:
        time.sleep(wait_seconds)
        print(f"时间到! 现在是 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, 请吃药!")

    return f"吃药提醒已执行: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"

def generate_verification_code(length=6):
    """生成指定长度的随机验证码"""
    # 使用数字和大写字母组合
    characters = string.digits + string.ascii_uppercase
    # 随机选择字符
    verification_code = ''.join(random.choice(characters) for _ in range(length))
    return verification_code

@app.task
def send_verification_email(email_to, subject="您的验证码", length=6):
    """
    生成随机验证码并发送邮件
    
    参数:
    - email_to: 收件人邮箱
    - subject: 邮件主题
    - length: 验证码长度
    
    返回:
    - 包含验证码的字典
    """
    # 生成验证码
    verification_code = generate_verification_code(length)
    
    # 邮件服务器配置
    # 注意: 这些是示例配置，实际使用时请替换为您自己的邮件服务器配置
    email_from = "2415621370@qq.com"  # 发件人邮箱
    email_password = "elhqtcdmibofebca"       # 发件人邮箱密码
    smtp_server = "smtp.qq.com"       # SMTP服务器地址
    smtp_port = 465                       # SMTP服务器端口
    
    try:
        # 创建邮件
        message = MIMEMultipart()
        message['From'] = email_from
        message['To'] = email_to
        message['Subject'] = subject
        
        # 邮件正文
        body = f"""
        <html>
        <body>
            <h2>验证码</h2>
            <p>您的验证码是: <strong>{verification_code}</strong></p>
            <p>此验证码有效期为10分钟。</p>
            <p>如果您没有请求此验证码，请忽略此邮件。</p>
        </body>
        </html>
        """
        message.attach(MIMEText(body, 'html'))
        
        print(f"正在连接到SMTP服务器 {smtp_server}:{smtp_port}...")
        
        # 连接到SMTP服务器并发送邮件
        # 对于端口465，使用SMTP_SSL而不是SMTP+starttls
        server = smtplib.SMTP_SSL(smtp_server, smtp_port, timeout=30)  # 设置30秒超时
        try:
            # 设置调试级别，可以看到与SMTP服务器的通信过程
            server.set_debuglevel(1)
            
            print(f"正在登录邮箱 {email_from}...")
            # 对于SMTP_SSL，不需要调用starttls()
            server.login(email_from, email_password)
            
            print(f"正在发送邮件到 {email_to}...")
            # 设置发送超时
            server.sock.settimeout(30)  # 设置套接字超时为30秒
            server.send_message(message)
            print("邮件发送完成")
            
            # 尝试正常关闭连接，但不抛出异常
            try:
                server.quit()
            except Exception as e:
                print(f"关闭连接时出现非致命错误（可以忽略）: {str(e)}")
                # 即使关闭连接时出错，邮件也已经发送成功了，所以我们仍然返回成功状态
            
            print(f"验证码 {verification_code} 已成功发送到 {email_to}")
            return {"success": True, "verification_code": verification_code, "email": email_to}
        finally:
            # 确保连接关闭
            try:
                server.close()
            except:
                pass
    
    except smtplib.SMTPAuthenticationError as e:
        error_msg = f"SMTP认证失败: {str(e)}. 请检查邮箱账号和密码是否正确。对于QQ邮箱，请确保使用的是授权码而不是登录密码。"
        print(error_msg)
        return {"success": False, "error": error_msg, "email": email_to}
    
    except smtplib.SMTPConnectError as e:
        error_msg = f"连接SMTP服务器失败: {str(e)}. 请检查SMTP服务器地址和端口是否正确，以及网络连接是否正常。"
        print(error_msg)
        return {"success": False, "error": error_msg, "email": email_to}
    
    except smtplib.SMTPException as e:
        # 检查是否是在发送QUIT命令时的错误
        error_str = str(e)
        if "QUIT" in error_str or (hasattr(e, 'args') and len(e.args) > 1 and isinstance(e.args[1], bytes) and b'\x00\x00\x00' in e.args[1]):
            # 这是在发送QUIT命令时的错误，但邮件可能已经成功发送
            print(f"在关闭连接时出现SMTP错误（可能已成功发送）: {error_str}")
            return {"success": True, "verification_code": verification_code, "email": email_to, "warning": "连接关闭时出现错误，但邮件可能已成功发送"}
        else:
            # 其他SMTP错误
            error_msg = f"SMTP错误: {error_str}"
            print(error_msg)
            return {"success": False, "error": error_msg, "email": email_to}
    
    except Exception as e:
        error_msg = f"发送邮件失败: {str(e)}"
        print(error_msg)
        return {"success": False, "error": error_msg, "email": email_to}